from IPython.display import Image
Image("Images/Overhead-Power-Lines.jpg", width = 950)
# Image reference: https://www.powerandcables.com/product/product-category/transmission-line-end-earthing-clamps/overhead-power-lines/
Adicionar descrição do problema
Inicialmente nesta sessão, será realizada a leitura dos dados cujo contém as caracteristicas extraídas de nosso conjunto de dados que contém os sinais ultrassônicos puros, com o propósito apenas de sua composição.
Para realizar esta extrassão de caracteristicas, utilizamos de códigos em Matlab, contidos em PreProcessing/NOMECODIGO.MAT, neste, foi realizado a leitura dos sinais captados, os quais foram divididos em intervalos de tempo menores a partir disto, foi realizados a extração da Media, do RMS, Maximo, Minimo, DesvioPadrao e Variancia.
Após isto, será realizado nesta sessão, a leitura do dataset com os itens intercalados, cujo pré-processamento, também foi realizado em MatLab, contido em PreProcessing/NOMECODIGO2.MAT. Com estes dados em memória, será realizado sua normalização e modelado as entradas e saídas dos modelos.
Nesta sessão, será realizada leitura dos dados extraídos a partir dos sinais ultrassônicos captados pelo microfone "ADICIONAR DESCRIÇÃO".
import os
import pandas as pd
data = pd.read_csv(os.path.join('Data','DadosExtraidos.csv'))
data = pd.DataFrame(data)
data.head()
data.tail()
Adicionar descrição de conclusões extraidas da analize dos dados
Basicamente, os dados estão muito bem estruturados, porém não normalizados, tendo valores com maximo e minimo em ordem de grandezas diferentes
data.describe()
Adicionar descrição de análise gráfica
import cufflinks as cf
import plotly.graph_objs as go
from plotly.offline import init_notebook_mode, iplot
cf.go_offline()
init_notebook_mode(connected=True)
data[['Media', 'RMS', 'Maximo', 'Minimo', 'DesvioPadrao', 'Variancia']].iplot()
data[['Classificador']].iplot()
É INTERESSANTE NESSA SESSÃO PARA INTERCALANDO OS DADOS COM MATLAB, E NAS CÉLULAS DE CÓDIGO EXECUTAR O CÓDIGO EM MATLAB E A PARTIR DAI LER OS DADOS
ADICIONAR DESCRIÇÃO DE COMO FOI INTERCALADO
data = pd.read_csv(os.path.join('Data','DadosExtraidosIntercalados.csv'))
data = pd.DataFrame(data)
data.head()
Comparar com o describe anterior, para verificar a veraticidade dos dados
data.describe()
data[['Media', 'RMS', 'Maximo', 'Minimo', 'DesvioPadrao', 'Variancia']].iplot()
Visto que nosso conjunto de dados é composto por caracteristicas contidas em diferentes, esta sessão visa normalizar os dados, deixando-os em um mesmo intervalo de valor. Foi escolhido como minimo e máximo, zero e um respectivamente, pois tende a facilitar o aprendizado dos modelos
from sklearn.preprocessing import MinMaxScaler
def get_normalised_data(data):
'''
Normaliza os dados numéricos (data) utilizando do método MinMaxScaler obtido da api Sklearn.
Parameters:
- data: conjunto de dados no formato Pandas DataFrame
'''
scaler = MinMaxScaler()
data = pd.DataFrame(scaler.fit_transform(data))
return data
y_data = data[['Classificador']]
x_data = data[['Media', 'RMS', 'Maximo', 'Minimo', 'DesvioPadrao', 'Variancia']]
x_data = get_normalised_data(x_data)
x_data.iplot()
Para assegurar que nosso modelo é confiável e aplicavel em uma situação real, foi separado o conjunto de dados em treino (75% dos exemplos) e teste (25% dos exemplos). Com isto o modelo irá aprender apenas com o conjunto de treino, e então, será medida sua acurácia com os dados de teste, estes, nunca vistos anteriormente pelo modelo.
import math
import numpy as np
from sklearn.model_selection import TimeSeriesSplit
x_data = np.array(x_data)
y_data = np.array(y_data).ravel()
tscv = TimeSeriesSplit(n_splits=3)
for train_index, test_index in tscv.split(x_data):
x_train, x_test = x_data[train_index], x_data[test_index]
y_train, y_test = y_data[train_index], y_data[test_index]
# Show the results of the split
print('%.1f%% dos dados foram separados para treinamento. Total de %.0f exemplos'
% (100 * x_train.shape[0] / x_data.shape[0], x_train.shape[0]))
print('%.1f%% dos dados foram separados para a realização de testes. Total de %.0f exemplos'
% (100 * x_test.shape[0] / x_data.shape[0], x_test.shape[0]))
O Objetivo desta sessão é criar, treinar, avaliar e aprimorar um modelo de aprendizado de máquina capaz de classificar o estado do isolador elétrico. Com isto, na sessão 2.1 será criado um modelo de arvore de decisão, com os parâmetros padrões da biblioteca sklearn. Na sessão 2.2 por sua vez, será utilizado da técnica Grid Search na tentativa de encontrar os melhores parâmetros para o modelo.
Adicionar descrição de por que foi escolhido desision tree
from sklearn.svm import SVC
from sklearn.tree import DecisionTreeClassifier
from sklearn.neighbors import KNeighborsClassifier
svc = SVC()
dtc = DecisionTreeClassifier()
knn = KNeighborsClassifier()
svc.fit(x_train, y_train)
dtc.fit(x_train, y_train)
knn.fit(x_train, y_train)
from sklearn.metrics import accuracy_score
test_predictions_SVC = svc.predict(x_test)
train_predictions_SVC = svc.predict(x_train)
print(accuracy_score(y_train, train_predictions_SVC))
print(accuracy_score(y_test, test_predictions_SVC))
test_predictions_DTC = dtc.predict(x_test)
train_predictions_DTC = dtc.predict(x_train)
print(accuracy_score(y_train, train_predictions_DTC))
print(accuracy_score(y_test, test_predictions_DTC))
test_predictions_KNN = knn.predict(x_test)
train_predictions_KNN = knn.predict(x_train)
print(accuracy_score(y_train, train_predictions_KNN))
print(accuracy_score(y_test, test_predictions_KNN))
Adicionar descrição sobre Grid Search
svc = SVC()
dtc = DecisionTreeClassifier()
knn = KNeighborsClassifier()
from sklearn.model_selection import GridSearchCV
parameters = [{'C': [0.25, 0.5, 1, 1.5, 2],
'degree': [2, 3, 4, 6],
'coef0': [0.0, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.4, 0.5, 0.7]
}]
grid_obj = GridSearchCV(svc, parameters, verbose=1, cv=3, n_jobs=-1)
grid_obj.fit(x_train, y_train)
svc = grid_obj.best_estimator_
print("Best Parameters")
print(grid_obj.best_params_)
parameters = [{'criterion': ['gini', 'entropy'],
'min_impurity_decrease': [0.0, 0.05, 0.1, 0.15, 0.2, 0.25, 0.3, 0.4, 0.5, 0.7]
}]
grid_obj = GridSearchCV(dtc, parameters, verbose=1, cv=3, n_jobs=-1)
grid_obj.fit(x_train, y_train)
dtc = grid_obj.best_estimator_
print("Best Parameters")
print(grid_obj.best_params_)
parameters = [{'n_neighbors': [2, 3, 4, 5, 6],
'weights': ['uniform', 'distance'],
'algorithm': ['ball_tree', 'kd_tree', 'brute'],
}]
grid_obj = GridSearchCV(knn, parameters, verbose=1, cv=3, n_jobs=-1)
grid_obj.fit(x_train, y_train)
knn = grid_obj.best_estimator_
print("Best Parameters")
print(grid_obj.best_params_)
test_predictions_SVC = svc.predict(x_test)
train_predictions_SVC = svc.predict(x_train)
print(accuracy_score(y_train, train_predictions_SVC))
print(accuracy_score(y_test, test_predictions_SVC))
test_predictions_DTC = dtc.predict(x_test)
train_predictions_DTC = dtc.predict(x_train)
print(accuracy_score(y_train, train_predictions_DTC))
print(accuracy_score(y_test, test_predictions_DTC))
test_predictions_KNN = knn.predict(x_test)
train_predictions_KNN = knn.predict(x_train)
print(accuracy_score(y_train, train_predictions_KNN))
print(accuracy_score(y_test, test_predictions_KNN))